home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / xlisp_21.zoo / xl-003.bug < prev    next >
Internet Message Format  |  1990-02-28  |  4KB

  1. From sce!mitel!uunet!cs.utexas.edu!tut.cis.ohio-state.edu!ucbvax!hplabs!hplabsz!mayer Fri Sep  1 08:29:10 EDT 1989
  2. Article: 141 of comp.lang.lisp.x
  3. Path: cognos!sce!mitel!uunet!cs.utexas.edu!tut.cis.ohio-state.edu!ucbvax!hplabs!hplabsz!mayer
  4. From: mayer@hplabsz.HPL.HP.COM (Niels Mayer)
  5. Newsgroups: comp.lang.lisp.x,comp.lang.lisp
  6. Subject: Bug+Fix for xlisp2.0 method definition <-> Question: Should "defmethod" and "defmacro" use lexical scoping
  7. Message-ID: <3860@hplabsz.HPL.HP.COM>
  8. Date: 26 Aug 89 13:37:22 GMT
  9. Reply-To: mayer@hplabs.hp.com (Niels Mayer)
  10. Organization: Hewlett-Packard Labs, Software Technology Lab, Palo Alto, CA.
  11. Lines: 83
  12. Xref: cognos comp.lang.lisp.x:141 comp.lang.lisp:1787
  13. Summary:
  14. Expires:
  15. Sender:
  16. Followup-To:
  17.  
  18. In looking over the xlisp 2.0 objects code, I found a problem in
  19. xlobj.c:clanswer() in which I noticed that the :answer method on class
  20. Class does not save the lexical (xlenv) and functional (xlfenv)
  21. environments in the closure created by xlclose() during method definition.
  22. Thus, when the method gets evaluated, you get unbound symbol/function
  23. errors because the environment of the method call doesn't contain the
  24. bindings present in the definition's environment.  [For you non xlispers
  25. out there, :answer defines a method on a class (essentially, a
  26. "defmethod").]
  27.  
  28. Before I commit to my fix, I wanted to ask you all whether there is a good
  29. reason for NOT using the lexical and functional environment of a call to
  30. "defmethod" during a method evaluation.
  31.  
  32. I would expect that you'd want to use lexical scoping for defining methods
  33. just like you would for defuns and lambdas. But I've been surprised before.
  34.  
  35. Another case in which xlclose() isn't passed xlenv and xlfenv is in
  36. xlcont.c:xdefmacro(). Is there a reason why you wouldn't want to pass
  37. in the lexical environment of a call to defmacro?
  38.  
  39.                 ----------
  40.  
  41. Here's some useless test code that illustrates the problem:
  42.  
  43.     lisp> (setq test_class (send Class :new '(a b c) '()))
  44.     lisp> (let (
  45.                 (x 666)
  46.                 (y 777)
  47.                 (z 888))
  48.             (send test_class :answer :isnew '()  ;initialize method
  49.             '(
  50.            (setq a x)
  51.            (setq b y)
  52.            (setq c z)
  53.            ))
  54.             )
  55.     lisp> (setq i (send test_class :new))
  56.  
  57. Now, upon sending the :new message, I get the error mesage
  58.  
  59.     lisp> error: unbound variable - X
  60.  
  61. After fixing the code in xlobj.c:clanswer(), I get the correct results:
  62.  
  63.     lisp> (send i :show)
  64.     lisp> Object is #<Object: #136002>, Class is #<Object: #127f40>
  65.     lisp>   A = 666
  66.     lisp>   B = 777
  67.     lisp>   C = 888
  68.     lisp> #<Object: #136002>
  69.  
  70.                 ----------
  71.  
  72. Here's the patch:
  73.  
  74. *** xlobj.c.~1~    Sat Aug 26 06:14:33 1989
  75. --- xlobj.c    Sat Aug 26 06:16:24 1989
  76. ***************
  77. *** 277,283
  78.       /* setup the message node */
  79.       xlprot1(fargs);
  80.       fargs = cons(s_self,fargs); /* add 'self' as the first argument */
  81. !     rplacd(mptr,xlclose(msg,s_lambda,fargs,code,NIL,NIL));
  82.       xlpop();
  83.   
  84.       /* return the object */
  85.  
  86. --- 277,283 -----
  87.       /* setup the message node */
  88.       xlprot1(fargs);
  89.       fargs = cons(s_self,fargs); /* add 'self' as the first argument */
  90. !     rplacd(mptr,xlclose(msg,s_lambda,fargs,code,xlenv,xlfenv));    /* changed by NPM -- pass in lexical and functional environment */
  91.       xlpop();
  92.   
  93.       /* return the object */
  94.  
  95. -------------------------------------------------------------------------------
  96.         Niels Mayer -- hplabs!mayer -- mayer@hplabs.hp.com
  97.           Human-Computer Interaction Department
  98.                Hewlett-Packard Laboratories
  99.                   Palo Alto, CA.
  100.                    *
  101.  
  102.  
  103.